4.1嵌入式系统启动流程
对于一个完整的嵌入式系统,它由U-boot、内核(Linux)、文件系统、应用程序四部分组成。那么这四部分之间的关系是怎么样的呢?OpenWrt是属于哪部分呢?
当我们拿到嵌入式设备,比如我们的MT7620开发板,然后给它一上电,首先运行的就是我们的U-boot程序,然后就是U-boot来启动我们的内核(Linux),当内核(Linux)启动完成以后,内核(Linux)就会去挂载我们的文件系统,当文件系统挂载成功以后,就会在文件系统上面运行我们的应用程序,比如我们学习C语言时写的HelloWorld应用程序。
OpenWrt系统是一个嵌入式的Linux发行版。它本生是包含了内核(Linux)和文件系统两部分的。因此,上一章中,我们编译出来的
openwrt-ramips-mt7620-youku-yk1-squashfs-sysupgrade.bin
固件,就是将内核(Linux)和文件系统打包成了一个bin文件。在这里,大家肯定会有疑问了,那么U-boot是谁提供的呢?对于其它的嵌入式设备,U-boot是需要我们单独来编译和烧写的,而对于我们的MT7620开发板,我们在出厂的时候,已经在开发板上的Flash中烧入了U-boot了。
那么大家马上肯定会问,我们可以自己烧写U-boot吗?答案是肯定的。我们可以自己烧写U-boot。如何烧写,我们会在后面进行讲解。
注意:虽然我们可以自己烧写U-boot,但是,如果不是动手能力特别强的同学,不建议自己烧写U-boot,因为随时都有可能变砖。变砖以后,就只能通过SPIFlash编程器来拯救了。虽然在后面的章节,会讲如何使用SPIFlash编程器来烧U-boot、固件。但是整个过程比较麻烦,所以请大家自己慎重。
4.2 U-boot菜单选项简介
将开发板的Mini-USB口通过USB线和电脑的USB口进行连接,然后安装串口驱动(只有第一次需要安装),USB转串口驱动文件如下,安装步骤不再赘述。
紧接着,如图3所示,在终端上设置好相应的串口(8N1,57600)。
打开putty串口下载软件,编者也给出了另一款下载软件securecrt,看读者喜好了。自己选择吧。
最后上电启动,便可以在串口上看到开发板的启动信息,首先打印出的是U-boot的版本等信息,如图4所示。
紧接着便进入了U-boot的菜单选项,如图5所示。这里一共有5秒的时间供大家选择。如果不做任何选择,5秒后,便自动启动内核。
1).选择1,表示将固件通过网络下载到内存中,如果是刷SDK固件,可以选择这个选项,但是,如果是刷OpenWrt,该选项没有用,我们会发现,刷固件成功以后,系统并不能正常启动;
2).选择2,表示将固件通过网络下载到Flash中,在以后的开发中,我们都是使用该选项;
3).选择3,表示启动内核(Linux),上面说的5秒结束,不做任何选择,系统就会默认来选择该选项,然后启动系统;
4).选择4,便会进入到U-boot的命令行,注意区分Linux系统的命令行。在U-boot的命令行我们可以使用printenv、set、loadb等命令。
5).选择7,表示将U-boot通过串口下载到Flash中;
6).选择9,表示将U-boot通过网络下载到Flash中。
4.3烧写OpenWrt固件
以下烧写方法,都是通过网络的方式进行烧写。因此,需要用到网线。接线方式有两种,一是通过网线将开发板的网口和电脑的网口直接相连(电脑—开发板);另一种是电脑和路由器通过网线或者wifi连接,然后开发板和路由器通过网线连接(电脑—路由器—开发板)。
为了更加方便和稳定,推荐使用第二种方法。
无论使用哪种方法,都必须遵循一个大前提,就是要让电脑和开发板的IP处于同一个网段。另外,一定要关闭电脑的防火墙和一些顽固的杀毒软件。
4.3.1通过网线下载
4.3.1.1设置ubuntu虚拟网卡
1 选择网卡
编辑->虚拟网络编辑器->桥接模式选择本机的物理网卡,见下图.
2 网络适配器设置
虚拟机->设置->网络适配器
4.3.1.2主服务器tftp服务器配置
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。TFTP承载在UDP上,提供不可靠的数据流传输服务,不提供存取授权与认证机制,使用超时重传方式来保证数据的到达。
0 IP配置
在谈TFTP之前,先简单讲一下Linux网络配置,网络中最重要的当然是IP地址了,这里不讲IP协议,在后面的网络编程再讲解,这里主要学习一下Linux下配置IP,配置IP地址的方法有两种:
配置静态IP:在主机进入网络之前,事先未主机设置固定的IP地址;
配置动态IP:选择DHCP网络服务,在主机进行网络之后,动态的随机获取IP地址;
当然,大家都知道ifconfig这个命令:
ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:6c:c2:ec
inet addr:172.16.58.130 Bcast:172.16.58.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe6c:c2ec/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:337 errors:0 dropped:0 overruns:0 frame:0
TX packets:358 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:123712 (123.7 KB) TX bytes:42430 (42.4 KB)
Interrupt:19 Base address:0x2024
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:149 errors:0 dropped:0 overruns:0 frame:0
TX packets:149 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:10307 (10.3 KB) TX bytes:10307 (10.3 KB)
如果ifconfig命令不带任何参数时,用于显示当前主机中状态为“活动”的网络接口信息;
当然,ifconfig命令可以修改IP地址:
sudo ifconfig eth0 192.168.3.51
但是这是动态的修改IP地址,重启以后,IP地址又变回原来的静态IP地址;修改IP地址除了可以在图形界面中修改,也可以在配置文件中修改,这才是Linux的特性!无论是配置静态IP还是动态IP,计算机系统将IP信息保存在什么地方呢?答案是配置文件 "/etc/network/interfaces".在UBuntu Linux 启动时就能获得IP地址的配置信息。若是配置静态IP。就从配置文件中读取IP地址参数,直接配置网络接口设备;若是配置动态IP,就通知主机通过DHCP协议获取网络配置。以下分别为配置静态IP和动态IP时,配置文件"/etc/network/interfaces"的实例:
动态IP
cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
静态IP
cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.3.51
netmask 255.255.0.0
gateway 192.168.1.1
重启下系统,用ifconfig命令查看IP地址
ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:6c:c2:ec
inet addr:192.168.3.51 Bcast:192.168.255.255 Mask:255.255.0.0
明显看到IP地址依然是我们静态修改过的IP地址。
注意:
1、若不能访问外网: ping 不通114.114.114.114
解决方法: sudo route add default gw 192.168.1.1
2、若不能访问域名: ping 不通baidu.com
解决方法:
1)– sudo vi /etc/resolv.conf
2) — 添加nameserver 114.114.114.114
1 检查是否安装tftp server
命令:dpkg –s tftpd-hpa
2 如果未安装则需要安装tftp-server
命令:sudo apt-get install tftp-hpa tftpd-hpa
Client:PC 安装tftp-hpa
Server:ARM 安装tftpd-hpa
后面的 tftp
3 修改文件 tftpd-hpa
命令:sudo vim /etc/default/tftpd-hpa
tftpd-hpa文件修改后如下:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
说明:修改项,其中TFTP_DIRECTORY处可以改为你的tftp-server的根目录,这里是/tftpboot,当然可以改成其他地址,参数 -c 指定了可以创建文件,参数 -s是指定tftpd-hpa服务目录,上面已经指定。
4 创建目录tftpboot,改变权限及启动
命令:
sudo mkdir /tftpboot
sudo chmod a+w /tftpboot
操作命令:
sudo service tftpd-hpa stop//停止
sudo service tftpd-hpa start//启动
sudo service tftpd-hpa status//查看tftp信息
sudo service tftpd-hpa restart//重启
5 测试
a、登陆服务器
tftp localhost或 tftp<主机IP>
b、从tftp服务器下载文件
tftp> get \
c、上传文件到tftp服务器
tftp> put\
d、查看帮助
tftp>?
tftp-hpa5.2
Commands may be abbreviated. Commands are:
connect connect to remote tftp
mode set file transfer mode
put send file
get receive file
quit exit tftp
verbose toggle verbose mode
trace toggle packet tracing
literal toggle literal mode, ignore’:’in file name
status show current status
binary set mode to octet
ascii set mode to netascii
rexmt set per-packet transmission timeout
timeout set total retransmission timeout
?print help information
help print help information
e、退出登陆
tftp> q
注意:必须是超级用户权限
6问题及原因(解决方法):
1、Transfer time out.
tftpd服务没有启动
2、Error code 0:Permission denied
可能是由SELinux造成的,在FC3和FC3以后的FC版本中SELinux默认的都是开启的,现在要关掉它。
修改文件/etc/sysconfig/selinux,设定SELINUX=disabled,然后重启电脑即可
或者执行命令system-config-securitylevel打开“安全级别配置”对话框,将SELinux(S)选项中“强制”改为“允许”
3、Error code 1:File not found
指定的文件夹不存在;或tftpd启动参数中没有指定-c选项,允许上传文件
4、Error code 2:Only absolute filenames allowed
TFTP_OPTIONS="-l -c -s",中的选项注意一下,是否没 -c
5、Error code 2:Access violation
上传的文件要有相应的可读写(覆盖)的权限才能上传,要对文件的权限进行修改
chmod 777 (文件名)
4.3.1.3主机端NFS配置
NFS是Network File System的简写,即网络文件系统。
网络文件系统是许多操作系统都支持的文件系统中的一种,也被成为NFS。NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户可以像访问本地文件一样访问远端系统上的文件。
NFS所提供的共享文件服务是建议在高度信任的基础上的,所以,向其他用户释放共享资源之前,一定要确保对方的可靠性。
NFS的应用:在我们嵌入式开发过程中,NFS是一个重要环节,我们常常·把“根文件”系统放在主机上,然后在开发板启动的时候通过NFS来挂载主机上的根文件系统。这样省去了每次都要把文件系统烧写到存储设备上的步骤,可以说比tftp更方便。
下面我们将以Ubuntu为例,讲解一下NFS的配置过程:
Server: PC
CLient : ARM(这里是用同一台机器模拟的,主要是安装过程)
1 检查是否安装nfs
命令:sudo dpkg -s install nfs-kernel-server
2 如果未安装则需要安装nfs-server
命令:sudo apt-get install nfs-kernel-server
3 修改配置文件及权限
命令:
sudo vim /etc/exports
sudo chmod 777 /tftpboot/rootfs
修改后的文件:
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#/tftpboot/rootfs *(rw,sync,no_root_squash,no_subtree_check)
格式说明:
共享目录:主机名称
主机名称或共享IP:允许按照指定权限访问这个目录的远程主机(如:开发板)
参数:
ro:只读权限
rw:读写权限
no_root_squash:如果是客户端root,那么他对这个目录具有root权限
root_squash:如果是客户端root,那么他的权限被限制为匿名使用者
all_squash:如果是客户端是什么身份,那么他的权限被限制为匿名使用者
4手动启停NFS服务
命令:
sudo/etc/init.d/nfs-kernel-server start
sudo /etc/init.d/nfs-kernel-server restart
sudo/etc/init.d/nfs-kernel-server stop
sudo/etc/init.d/nfs-kernel-server restart//重新启动
5 共享操作
sudo/etc/init.d/nfs-kernel-server status//查看NFS服务当前状态
showmount –e 192.168.3.51 //查看NFS服务器的共享资源
sudo mount –t nfs 192.168.3.51: /tftpboot/rootfs/mnt/nfs//挂载共享资源
-t 指类型,这里是NFS;
192.168.3.51是服务端的IP地址;
/tftpboot/rootfs 是服务端的共享目录;
/mnt/nfs是挂载点,是客户端的目录;
当客户端使用mount命令讲NFS服务器上的到处文件系统挂载到本地后,接下来对挂载的文件系统的操作与使用本地文件系统没有任何区别。
sudo umount/mnt/nfs//卸载共享资源
需要说明的是,当有用户正在使用某个已加载的共享目录上的文件时,则不能卸载该文件系统,如果用户确认无误,可以使用“umount -f”命令强行卸载共享的目录。
6测试
\第一种方法)showmount -e
第二种方法)自己挂载
mount -t nfs 127.0.0.1:/nfsboot /mnt/xxx
注意:必须是超级用户权限
连接串口和板子,运行串口通信程序(putty在工具),设置相关参数。
然后开发板上电,在如图10所示的界面中,选择2。
在图10所示界面中,我们输入y以确定我们是要烧写固件到Flash中。接着便会进入到如图11所示界面。
1).如图11所示的1中,输入设备IP,这个IP可以是任意的,但是必须要和2中输入的服务器IP是同一个网段;
2).如图11所示的2中,输入服务器IP;
3).如图11所示的3中,输入我们要下载的固件的名字。以上3点设置好以后,最后回车,便开始下载程序了。如图12所示。
注意:
1).出现#####,表示下载正在下载,一切正常;出现TTTTT,则说明我们哪里设置不对,需要从头重新设置一下。
2).如图12所示,当串口打印出raspi_erase信息的时候,表示正在擦除Flash中的数据,此时一定不要强行断电和退出,否则开发板就变砖了。
4.3.2通过tftpd32软件
Tftpd32软件适用于32位系统和部分64位系统。首先启动软件,Tftpd32的界面如下。
①对应的CurrentDirectory用于选择固件所在的目录,通过Browse按钮来进行选择设置。比如,我将固件放在了G:盘的tftpboot目录,则需要进行如图2所示的设置。
②对应的Serverinterface用于选择服务器的IP地址。此时,如果你是通过网线和开发板或者路由器进行连接,那么这里就应该选择为本地有线网卡的IP地址;如果是通过WiFi和路由器进行连接,那么这里应该选择为无线网卡的IP地址。
注意:电脑的IP地址通过在运行(win+R就可打开,方法很多)中CMD中输入ipconfig命令得到,如图14所示。
当Tftpd32软件设置完成以后,接下来就是将开发板的Mini-USB口通过USB线和电脑的USB口进行连接,然后安装串口驱动和设置好相应的串口(8N1,57600),然后开发板上电,在如图15所示的界面中,选择2。
在图15所示界面中,我们输入y以确定我们是要烧写固件到Flash中。接着便会进入到如图16所示界面。
1).如图16所示的1中,输入设备IP,这个IP可以是任意的,但是必须要和2中输入的服务器IP是同一个网段;
2).如图16所示的2中,输入服务器IP;
3).如图16所示的3中,输入我们要下载的固件的名字。以上3点设置好以后,最后回车,便开始下载程序了。如图17所示。
注意:
1).出现#####,表示下载正在下载,一切正常;出现TTTTT,则说明我们哪里设置不对,需要从头重新设置一下。
2).如图17所示,当串口打印出raspi_erase信息的时候,表示正在擦除Flash中的数据,此时一定不要强行断电和退出,否则开发板就变砖了。
4.3.3通过3CDaemon软件
3CDaemon适用于64位系统。首先启动软件,3CDaemon的界面如下。
当我们启动好3CDaemon软件以后,我们发现它监听了电脑上所有网卡的IP地址,这也是较Tftpd32软件好的地方,不用我们自己选择指定IP。但是,任然需要我们来设置固件所在目录。点如图18所示的,点击“设置TFTP服务器”按钮,会弹出如图19所示的对话框。在该对话框中选中固件的存放目录即可。
当3CDaemon软件设置好以后,接下来的操作又和使用Tftpd32软件的过程一样了。开发板上电,选2,输入y,设置设备IP、服务器IP、固件的名字。
注意:对于不会从Ubuntu下载固件的朋友,编者也将固件放在附件里,直接使用就行了。但是想更好地掌握openwrt的朋友,还是要多学习啊。
怎么没有第三章?
有的,第3章 是 Openwrt下载及配置:https://blog.bruceou.cn/2020/05/3-openwrt-download-and-configuration/178/